热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

首部|接口类型_OSI7层模型&TCP/IP协议首部封装格式解析

篇首语:本文由编程笔记#小编为大家整理,主要介绍了OSI 7层模型 & TCP/IP协议首部封装格式解析相关的知识,希望对你有一定的参考价值。 概述 物理层:主要定义物理设备标准&#

篇首语:本文由编程笔记#小编为大家整理,主要介绍了OSI 7层模型 & TCP/IP协议首部封装格式解析相关的知识,希望对你有一定的参考价值。



概述


  1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

  2. 数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1(端到端)

  3. 网络层:为在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。(主机(ip)到主机(ip))

  4. 传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做。( 端口(ip+port)到端口(ip+port))

  5. 会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。

  6. 表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。

  7. 应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。


TCP数据包的封装格式


不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。


以太网帧首部


/* default snap length (maximum bytes per packet to capture) */
#define SNAP_LEN 1518
/* ethernet headers are always exactly 14 bytes [1] */
#define SIZE_ETHERNET 14
/* Ethernet addresses are 6 bytes */
#define ETHER_ADDR_LEN 6
/* Ethernet header */
struct sniff_ethernet
u_char ether_dhost[ETHER_ADDR_LEN]; /* destination host address */
u_char ether_shost[ETHER_ADDR_LEN]; /* source host address */
u_short ether_type; /* IP? ARP? RARP? etc */
;

IP首部



IP是TCP/IP协议簇中最为重要的协议。所有的TCP,UDP, ICMP和IGMP数据都以IP数据报格式传输IP提供的是不可靠、无连接的协议


/* IP header */
struct sniff_ip
u_char ip_vhl; /* version <<4 | header length >> 2 &#xff08;8bits&#xff09;待分割*/
u_char ip_tos; /* type of service&#xff08;8bits&#xff09; */
u_short ip_len; /* total length&#xff08;16bits&#xff09; 这个是ip包长度&#xff0c;区分首部长度*/
u_short ip_id; /* identification&#xff08;16bits&#xff09; 认证 */
u_short ip_off; /* fragment offset field&#xff08;16bits&#xff09;待分割 */
/*下面三个成员项是对ip_off的借位&#xff0c;u_short共2Bytes即16bits&#xff0c;0x代表16进制位&#xff0c;且每个16进制位对应拓展成4个二进制位*/
#define IP_RF 0x8000 /* reserved fragment flag&#xff08;1bits&#xff09; 保留位 */
#define IP_DF 0x4000 /* dont fragment flag&#xff08;1bits&#xff09; 分片位 */
#define IP_MF 0x2000 /* more fragments flag&#xff08;1bits&#xff09; "是否更多"位 */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits&#xff08;13bits&#xff09; */
u_char ip_ttl; /* time to live TTL*/
u_char ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
;
#define IP_HL(ip) (((ip)->ip_vhl) & 0x0f) /* Header Length (4bits)*/
#define IP_V(ip) (((ip)->ip_vhl) >> 4) /* Version (4bits)*/

TCP首部



TCP提供一种面向连接的、可靠的字节流服务。如果不计选项字段&#xff0c;它通常是20个字节。



  • 4位头部长度&#xff1a; 标识该tcp头部有多少个32bit字&#xff08;4字节&#xff09;因为4位最大能表示15&#xff0c;所以tcp头部最长是60字节。

  • 6位标志位&#xff08;即图中的保留6位&#xff09;&#xff1a;标志位有如下几项

  • URG标志&#xff0c;表示紧急指针是否有效

  • ACK标志&#xff0c;表示确认号是否有效。称携带ACK标志的tcp报文段为确认报文段

  • PSH标志&#xff0c;提示接收端应用程序应该立即从tcp接受缓冲区中读走数据&#xff0c;为接受后续数据腾出空间&#xff08;如果应用程序不将接收的数据读走&#xff0c;它们就会一直停留在tcp缓冲区中&#xff09;

  • RST标志&#xff0c;表示要求对方重新建立连接。携带RST标志的tcp报文段为复位报文段

  • SYN标志&#xff0c;表示请求建立一个连接。携带SYN标志的tcp报文段为同步报文段

  • FIN标志&#xff0c;表示通知对方本端要关闭连接了。携带FIN标志的tcp报文段为结束报文段

  • 16位窗口大小&#xff1a;是tcp流量控制的一个手段。这里说的窗口&#xff0c;指的是接收通告窗口。它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据&#xff0c;这样对方就可以控制发送数据的速度

  • 16位校验和&#xff1a;由发送端填充&#xff0c;接收端对tcp报文段执行CRC算法以校验tcp报文段在传输过程中是否损坏。注意&#xff0c;这个校验不仅包括tcp头部&#xff0c;也包括数据部分。这也是tcp可靠传输的一个重要保障。

  • 16位紧急指针&#xff1a;是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。因此&#xff0c;确切的说&#xff0c;这个字段是紧急指针相对当前序列号的偏移&#xff0c;称为紧急偏移。tcp的紧急指针是发送端向接收端发送紧急数据的方法

  • 16位选项&#xff1a;TCP头部的最后一个选项字段可变长的可选信息。这部分最多包含40字节&#xff0c;因为TCP头部最长是60字节&#xff08;其中还包含前面讨论的20字节的固定部分&#xff09;。典型的TCP头部选项结构如图所示。

/* TCP header */
typedef u_int tcp_seq;
struct sniff_tcp
u_short th_sport; /* source port (16bits)*/
u_short th_dport; /* destination port (16bits)*/
tcp_seq th_seq; /* sequence number (32bits)*/
tcp_seq th_ack; /* acknowledgement number (32bits)*/
u_char th_offx2; /* data offset, rsvd (8bits,待分割)*/
#define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)
u_char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
u_short th_win; /* window */
u_short th_sum; /* checksum */
u_short th_urp; /* urgent pointer */
;

推荐阅读
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 大数据基础:JavaSE_day06 ... [详细]
  • 本文详细介绍了Java中的`ByteArrayInputStream`和`ByteArrayOutputStream`,包括它们的基本概念、工作原理及具体应用实例。`ByteArrayInputStream`用于处理内存中的字节数组,而`ByteArrayOutputStream`则用于将数据写入内存中的字节数组。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
author-avatar
最最时尚搭配攻略_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有